package main

import (
	"fmt"
	"sync"
	"time"
)

//go 协程通信 chan
func main() {
	fmt.Println("examp21")
	wg := sync.WaitGroup{}
	wg.Add(10)                   //开启10个计数
	var data = make(chan int, 1) //使用make 来创建一个通道chan
	//参数chan 类型，和容量。如果不指定容量，需要先取值后赋值，不然会报错

	//开启两个协程
	//协程一
	go func() {
		var i = 0
		for {
			fmt.Println("赋值", i)
			data <- i //赋值
			i++
			time.Sleep(time.Second / 2) //等待1/2秒
			wg.Done()                   //--计数
		}
	}()
	//协程二
	go func() {
		for {
			//			d := <-data
			//			fmt.Println("取到一个值为", d)
			select { //配合select使用类似监听io操作,一搬配合chan使用,因为通道有可能有多种，所以不同的case就可以取不同的chan值
			case d := <-data: //这里只有一个chan示例
				fmt.Println("取到一个值为", d)
			}
		}
	}()

	//select {} //也会阻塞线程只不过一直阻塞着
	wg.Wait() //阻塞主线程，直到计数器值为0立即停止主线程，子线程有可能还有没执行完的
}
